home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / PROGRAM / DESDOS.ARJ / DESCALC.C < prev    next >
C/C++ Source or Header  |  1992-05-15  |  2KB  |  92 lines

  1. /* DES "desk calculator"
  2.  * Phil Karn
  3.  * January 1987
  4.  */
  5. #include <stdio.h>
  6. #include <ctype.h>
  7. main()
  8. {
  9.     char key[8],work[8];
  10.     char line[80];
  11.     int keyset = 0;
  12.  
  13.     if(desinit(0) == -1){
  14.         printf("DES initialization failed\n");
  15.         exit(1);
  16.     }
  17.     printf("Enter in hexadecimal:\nk <key>\np <plaintext>\nc <ciphertext>\n");
  18.     printf("s - standard DES mode\n");
  19.     printf("f - fast mode (no IP)\n"); 
  20.     for(;;){
  21.         gets(line);
  22.         if(feof(stdin))
  23.             break;
  24.         if(isupper(line[0]))
  25.             line[0] = tolower(line[0]);
  26.         switch(line[0]){
  27.         case 's':
  28.             desdone();
  29.             desinit(0);
  30.             if(keyset)
  31.                 setkey(key);
  32.             break;
  33.         case 'f':
  34.             desdone();
  35.             desinit(1);
  36.             if(keyset)
  37.                 setkey(key);
  38.             break;
  39.         case 'k':    /* Set key */
  40.             get8(&line[1],key);
  41.             setkey(key);
  42.             keyset = 1;
  43.             break;
  44.         case 'c':    /* Decrypt ciphertext */
  45.             if(!keyset){
  46.                 printf("Enter key\n");
  47.                 break;
  48.             }
  49.             get8(&line[1],work);
  50.             dedes(work);
  51.             printf("Plaintext: ");
  52.             put8(work);
  53.             printf("\n");
  54.             break;
  55.         case 'p':    /* Encrypt plaintext */
  56.             if(!keyset){
  57.                 printf("Enter key\n");
  58.                 break;
  59.             }
  60.             get8(&line[1],work);
  61.             endes(work);
  62.             printf("Ciphertext: ");
  63.             put8(work);
  64.             printf("\n");
  65.             break;
  66.         default:
  67.             printf("eh?\n");
  68.             break;
  69.         }
  70.     }
  71. }
  72. get8(buf,cp)
  73. char *buf;
  74. register char *cp;
  75. {
  76.     int ikey[8],i;
  77.  
  78.     sscanf(buf,"%2x%2x%2x%2x%2x%2x%2x%2x",&ikey[0],&ikey[1],&ikey[2],
  79.         &ikey[3],&ikey[4],&ikey[5],&ikey[6],&ikey[7]);
  80.     for(i=0;i<8;i++)
  81.         *cp++ = ikey[i];
  82. }
  83. put8(cp)
  84. register char *cp;
  85. {
  86.     int i;
  87.  
  88.     for(i=0;i<8;i++){
  89.         printf("%02x ",*cp++ & 0xff);
  90.     }
  91. }
  92.